package cn.mujiankeji.mbrowser.界面.标签页.快照

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import cn.mujiankeji.mbrowser.工具.JSON
import cn.mujiankeji.mbrowser.工具.mlog
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.工具.网络.网络操作
import cn.mujiankeji.mbrowser.数据.枚举类.页面状态枚举
import cn.mujiankeji.mbrowser.数据.快照来源.快照来源接口
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBHistory
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.小窗页.请求.添加书签窗口状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import cn.nr19.jian.E2Factory
import cn.nr19.jian.`object`.JianLei
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
import org.koin.core.context.GlobalContext

abstract class 快照状态() : 标签页状态() {

    var coroutine : CoroutineScope? = null
    var 加载出错信息 by mutableStateOf<String?>(null)
    abstract fun 来源() : 快照来源接口

    suspend fun 重载(){
        super.加载进度.value = 0
        加载()
    }
    suspend fun 加载(){
        super.状态.value = 页面状态枚举.加载中
        super.加载进度.value = 60
        super.地址.value = 来源().地址

        var headers : Map<String, String> ?= null
        来源().协议头?.let {
            try {
                headers = JSON.decodeFromString<Map<String, String>>(it)
            }catch (_ : Exception){

            }
        }

        网络操作.获取文本(url = 来源().地址,
            ua = 应用配置.读取本机UA标识(),headers,
            10000,
            onError =
                { msg, ex->
                    加载出错信息 = msg
                    super.状态.value = 页面状态枚举.失败
                    super.加载进度.value = 0
                })?.let {
                    withContext(Dispatchers.IO){
                        加载(it)
                        添加历史记录()
                    }
                }

    }

    abstract suspend fun CoroutineScope.加载(code : String)

    suspend fun tryText(content : String,rule : String,jian : JianLei) : String{
        if (rule.isEmpty()) return ""
        return try {
            E2Factory.text(content,rule,jian)
        }catch (e : Exception){
            e.printStackTrace()
            null
        } ?: ""
    }
    suspend fun tryUrl(content: String,rule : String,jian : JianLei) : String? {
        return tryText(content,rule,jian).let {
            if (it.isNotEmpty()) 地址操作.取绝对地址(it,来源().地址)
            else null
        }
    }
    suspend fun tryList(content: String,rule : String,jian : JianLei) : List<String>? {
        if (rule.isEmpty()) return null
        try {
            return E2Factory.list(content,rule,jian)
        }catch (e : Exception){
            e.printStackTrace()
            return null
        }
    }

    suspend fun 添加历史记录(){
        val db = GlobalContext.get().get<AppDatabase>()
        val dao = db.历史()

        // 获取当前网页地址和标题
        val 当前地址 = 地址.value ?: return
        val 当前标题 = 标题.value ?: 当前地址

        // 忽略空地址或特殊地址（比如about:blank）
        if (当前地址.isEmpty() || 当前地址.startsWith("about:") || 当前地址.startsWith("chrome:")) {
            return
        }

        // 检查是否存在相同URL的历史记录
        val 已有记录 = dao.根据网址获取历史记录(当前地址)

        if (已有记录 != null) {
            // 如果已存在，更新访问时间和访问次数
            已有记录.添加时间 = Clock.System.now().toEpochMilliseconds()
            已有记录.访问次数 += 1
            // 如果标题有变化，更新标题
            if (当前标题.isNotEmpty() && 当前标题 != 已有记录.标题) {
                已有记录.标题 = 当前标题
            }
            dao.更新历史记录(已有记录)
        } else {
            // 如果不存在，创建新记录
            val 新历史记录 = DBHistory(
                标题 = 当前标题,
                网址 = 当前地址,
                添加时间 = Clock.System.now().toEpochMilliseconds(),
                访问次数 = 1
            )
            dao.插入历史记录(新历史记录)
        }


    }

    override var 可否添加收藏: Boolean = true
    override fun 添加收藏() {
        val title = 地址.value?:""
        val url = 标题.value?:""
        添加书签窗口状态(url,title).显示()
    }

}